<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>

</body>
<script>
  // 数组扁平化(数组降维，将嵌套的的多个数组转化为一个数组)
  // 数组里面套数组，例如：[1, [2, [3, [4, 5]]], 6]
  // 将这个数组变成：[1, 2, 3, 4, 5, 6]

  const arr = [1, [2, [3, [3, 4, 5]]], 6]
  // 第一种
  // es6自带方法 flat
  // arr.flat(depth)
  // 参数depth：指定要提取嵌套数组的结构深度，默认值为 1。
  // 如果想展开任意深度的嵌套数组：Infinity  无穷的
  function flatten(params) {
    return params.flat(Infinity)
  }
  console.log('es6 自带方法', flatten(arr));

  // 第二种
  // 把数组转化成字符串(toString)
  function flatten(arr) {
    // 先将数组转化成字符串
    // 然后通过 split(',') 转化成数组
    // 过滤掉为空的元素
    // console.log(arr.toString().split(',').filter(item => item != ""));
    return arr.toString().split(',').map(item => Number(item))
  }
  console.log('toString方法', flatten(arr));


  // const arr1 = [1, [2, [3, [3, 4, 5]]], 6]
  // 第三种
  // 使用JSON.stringify()+正则

  function flatten(arr) {
    // 将数组转化成 json 字符串
    // 再通过正则将 [ 和 ] 去除掉
    let str = JSON.stringify(arr).replace(/(\[|\])/g, '')
    return str.split(',').map(item => Number(item))
  }
  console.log('使用正则替换方法', flatten(arr));


  // 第四种
  // 使用 some
  function flatten(arr) {
    while (arr.some(item => Array.isArray(item))) {
      arr = [].concat(...arr)
    }
    return arr
  }
  console.log('some方法', flatten(arr));

  // 第五种
  // 使用循环递归实现
  function flatten(arr) {
    let result = []
    for (let i = 0; i < arr.length; i++) {
      // 如果是数组就使用递归的方式继续执行
      // 如果不是就直接 push 到准备好的数组里
      if (Array.isArray(arr[i])) {
        result = result.concat(flatten(arr[i]))
      } else {
        result.push(arr[i])
      }
    }
    return result
  }
  console.log('循环递归方法', flatten(arr));
</script>

</html>